﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using HRX.PayCenter.ApplicationCore.Interfaces;
using System.Collections.Specialized;
using HRX.PayCenter.Web.Extensions;
using HRX.PayCenter.Contract;
using OSS.PaySdk.Ali.Pay.Mos;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using HRX.PayCenter.ApplicationCore;
using Microsoft.Extensions.Logging;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace HRX.PayCenter.Web.Controllers.Api
{
    /// <summary>
    /// 支付宝回调
    /// </summary>
    [Route("api/alipay")]
    public class AlipayCallBackController : BaseApiController
    {
        private readonly IRouteService _routeService;
        private readonly PayCenterConfig _payCenterConfig;
        private readonly ILogger<AlipayCallBackController> _appLogger;

        private const string failReturn = "fail";
        private const string successReturn = "success";

        /// <summary>
        /// 
        /// </summary>
        /// <param name="routeService"></param>
        public AlipayCallBackController(IRouteService routeService, ILogger<AlipayCallBackController> appLogger, IOptions<PayCenterConfigWarpper> payCenterConfigWarp)
        {
            _routeService = routeService;
            _appLogger = appLogger;
            _payCenterConfig = payCenterConfigWarp.Value.PayCenterConfig;
        }

        /// <summary>
        /// 异步通知
        /// </summary>
        /// <returns></returns>
        [HttpPost("notify")]
        public async Task<string> Notify([FromForm]ZPayCallBackResp zPayCallBackResp)
        {
            /* 实际验证过程建议商户添加以下校验。
               1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
               2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
               3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
               4、验证app_id是否为该商户本身。
               */
            IDictionary<string, string> dict = null;
            try
            {
                dict = Request.Form.FormDict();
            }
            catch (Exception ex)
            {
                _appLogger.LogError(ex, "支付宝异步请求异常");
            }
            if (dict == null)
            {
                return failReturn;
            }
            var payService = _routeService.GetPayService("Alipay");
            if (!payService.CheckCallBackSign(dict))
            {
                return failReturn;
            }//验签
            var ret = await payService.CheckOrderOrUpdate(zPayCallBackResp, true);
            if(!ret)
            {
                return failReturn;
            }
            return successReturn;
        }

        /// <summary>
        /// 同步返回
        /// </summary>
        /// <returns></returns>
        [HttpGet("return")]
        public async Task<string> Return([FromQuery]ZPayCallBackResp zPayCallBackResp)
        {
            /* 实际验证过程建议商户添加以下校验。
               1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
               2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
               3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
               4、验证app_id是否为该商户本身。
               */
            IDictionary<string, string> dict = Request.Query.QueryDict();
            var payService = _routeService.GetPayService("Alipay");
            if (!payService.CheckCallBackSign(dict))
            {
                return failReturn;
            }//验签
            if (!await payService.CheckOrderOrUpdate(zPayCallBackResp, false))
            {
                return failReturn;
            }
            //302重定向页面
            var response = HttpContext.Response;
            response.StatusCode = StatusCodes.Status302Found;
            response.Redirect(string.Format(_payCenterConfig.ReturnUrl, zPayCallBackResp.out_trade_no));
            return successReturn;
        }
    }
}
